# 普通类的命名规则：每个单词首字母大写
# 私有类命名规则：_开头,
# 私有方法命名规则：_开头,
# 私有属性命名规则：_开头,
# 私有常量命名规则：全大写

class Person:
    # 类的属性
    native_place = "北京"

    # 初始化方法
    def __init__(self, name, age):
        self.name = name
        self.age = age

    # 实例方法
    def eat(self):
        print("人在吃饭")


# 继承
class StudentA(Person):
    pass


class Student(Person):
    # 类的属性
    native_place = "吉林"

    # 私有类属性
    __score = 100

    # 初始化方法
    def __init__(self, name, age):
        super().__init__(name, age)
        print("我是子类的初始化方法")
        print("我的名字是{0}".format(self.name))
        self.name = name
        self.age = age

    # 析构方法
    def __del__(self):
        print("我被销毁了")

    # 字符串方法, 可以自定义字符串的输出格式
    def __str__(self):
        return "我的名字是{0}".format(self.name)

    # 实例方法
    def eat(self):
        Person.eat(self)
        super().eat()
        print("学生在吃饭")

    # 私有实例方法
    def __test(self):
        print("私有方法")

    # 静态方法
    @staticmethod
    def method():
        print("我使用了staticmethod进行修饰，所以我是静态方法")


# 查看类的属性和方法
# print(Student.__dict__)
# 修改类的属性
# Student.native_place = "天津"
# print(Student.native_place)
# 删除类的属性
# del Student.native_place
# print(Student.__dict__)
# 新增类的属性
# Student.native_place = "北京"
# print(Student.native_place)
# s = Student("张三", 20)
# 手动调用析构方法
# del s
# print("-" * 5)
sA = StudentA("富二代", 30)
sA.eat()
s = Student("张三", 50)
# print(s.__score)
# 外部可以通过_类名__属性名访问私有属性
# print(Student._Student__score)
s._Student__score = 10
print(s._Student__score)
print(s._Student__test())
s.eat()